#include "admin.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>

//菜单

void admin_menu(void)               //管理员菜单
{
    system("clear");
    puts("*****管理员系统*****");
	puts("1、后勤");
	puts("2、VIP");
	puts("3、设置收款账户");
	puts("4、返回上一级");
}

void admin_logistics_menu(void)     //管理员管理后勤人员菜单
{
    system("clear");
    puts("*****管理员后勤系统*****");
	puts("1、增加后勤人员");
	puts("2、开除后勤人员");
	puts("3、修改后勤人员信息");
	puts("4、查看后勤人员名单");
	puts("5、返回上一级");
}

void admin_vip_menu(void)           //管理员管理VIP菜单
{
	system("clear");
    puts("*****管理员VIP系统*****");
	puts("1、增加VIP");
	puts("2、注销VIP");
	puts("3、修改VIP信息");
	puts("4、查看VIP名单");
	puts("5、返回上一级");
}

void admin_reducelog_menu(void)    //删除后勤人员菜单
{
	system("clear");
    puts("*****您选择输入一项员工数据*****");
	puts("1、输入员工ID");
	puts("2、输入员工姓名");
	puts("3.返回上一级");
}

void person_choicechange_menu(void)        //选择哪一项更改
{
	system("clear");
	puts("*****请选择要修改的数据*****");
	puts("1、姓名");
	puts("2、密码");
	puts("3、退出");
}

void money_menu(void)             //账户管理
{
	system("clear");
    puts("*****账户管理系统*****");
	puts("1、更改账户");
	puts("2、查看账户");
	puts("3、返回上一级");
}



//管理员系统
int login_admin(void)  //管理员登录
{
	system("clear");

	printf("请输入管理员名称\n");
	char user[20];
	get_str(user,sizeof(user));
	printf("请输入密码\n");
	char password[20];
	get_passwd(password,sizeof(password));
	if(0 == strcmp(user,"admin") && 0 == strcmp(password,"123456"))
	{
		print_sec("登录成功",0.75);
		return 0;
	}
	print_sec("用户名或密码错误!",0.75);
	return -1;
}

void admin(void) //管理员界面
{
	if(0 != login_admin())
	{
		return ;
	}
    for(;;)
	{
		admin_menu();

		switch(get_cmd('1','4'))
		{
		case '1': register_logistics();break;       //管理后勤
		case '2': register_vip(); break;    //管理VIP
		case '3': manage_money(); break;
		case '4': return;
		}
	}
}



//管理员后勤界面
void register_logistics(void)
{
	for(;;)
	{
		admin_logistics_menu();

		switch(get_cmd('1','5'))
		{
		case '1': add_logistics();break;     //增加后勤人员
		case '2': reduce_logistics();break;  //删除后勤人员
		case '3': change_logistics(); ;break;//修改后勤人员信息
		case '4': show_person();break;
		case '5':return;
		}
	}
}

void add_logistics(void)   			//增加后勤人员
{
	

    // 判断用户是否已满
	if(cnt_person >= PERSON_MAX)
	{
		print_sec("后勤人员数量已满，无法添加！",0.75);
		return;
	}
	//输入ID
	person[cnt_person].id = get_personid();//自动获取空余ID函数;
	printf("后勤人员ID为:%d\n",person[cnt_person].id);

	// 输入用户名
	printf("请输入后勤人员名字(简写)：\n");
	get_str(person[cnt_person].name,sizeof(person[cnt_person].name));
	

	// 输入密码
	char password[33];
	printf("请输入密码:\n");
	get_passwd(person[cnt_person].password,sizeof(person[cnt_person].password));
	printf("请再次输入密码:\n");
	get_passwd(password,sizeof(password));
	if(strcmp(person[cnt_person].password,password))			
	{
		printf("%s\n%s\n",password,person[cnt_person].password);
		print_sec("两次密码输入不一,注册失败!",0.75);
		return;
	}
	//使用MD5进行加密
	MD5_CTX md5c;

	MD5Init(&md5c);
	int passwd_len = strlen(password);
	MD5Update(&md5c,(unsigned char*)password,passwd_len);
	MD5Final(&md5c,(unsigned char*)person[cnt_person].password);
	person[cnt_person].password[passwd_len] = '\0';

	// 用户数量+1
	cnt_person++;

	print_sec("注册成功!",0.75);
}

void show_person(void)     			//遍历后勤
{
	qsort(person,cnt_person,sizeof(person[0]),cmp_personid);			//快速排序,以ID为排序变量，从小到大
	for(int i=0; i<cnt_person; i++)
	{
		printf("ID:%d 姓名:%s\n",
			person[i].id,
			person[i].name);
	}
	anykey_continue();
}

void reduce_logistics(void)   		//选择输入员工ID来进行删除
{
	system("clear");
	printf("请输入后勤员工ID:\n");
	int id;
	scanf("%d",&id);
	int place = query_personid(id);
	if(-1 == place)
	{
		print_sec("没有该ID的员工!\n",0.75);
		return;
	}
	reduce(place,REDUCE_PERSON);
}

void change_logistics(void)
{
	system("clear");
	printf("请输入后勤员工ID:\n");

	int id;
	scanf("%d",&id);
	getchar();
	int position = query_personid(id);
	if(-1 == position)
	{
		print_sec("没有该ID的员工!\n",0.75);
		return;
	}

	printf("请输入后勤人员密码:\n");
	char password[33];          									  //用于接受修改数据
	get_passwd(password,sizeof(password));

	//使用MD5进行加密
	MD5_CTX md5c;
	MD5Init(&md5c);
	int passwd_len = strlen(password);
	MD5Update(&md5c,(unsigned char*)password,passwd_len);
	MD5Final(&md5c,(unsigned char*)password);
	password[passwd_len] = '\0';

	if(strcmp(person[position].password,password))                          //密码输入正确
	{
		print_sec("密码输入错误,不能修改!",0.75);
		return;
	} 
    person_choicechange_menu();
	switch(get_cmd('1','3'))
	{
	case '1':change_name(position);break;
	case '2':change_password(position);break;
	}
}


void change_name(int position) //修改姓名
{
	printf("姓名:%s\n",person[position].name);//显示原来姓名
	printf("请输入更改后后勤人员信息:\n");
	get_str(person[position].name,sizeof(person[position].name));
	print_sec("修改成功!",0.75);
}


void change_password(int position) //修改密码
{
	printf("请输入更改后后勤人员密码:\n");
	char password[33];          									  //用于接受修改数据
	get_passwd(password,sizeof(password));

	//使用MD5进行加密
	MD5_CTX md5c;
	MD5Init(&md5c);
	int passwd_len = strlen(password);
	MD5Update(&md5c,(unsigned char*)password,passwd_len);
	MD5Final(&md5c,(unsigned char*)person[position].password);
	person[position].password[passwd_len] = '\0';

	print_sec("修改成功!",0.75);
}




//管理VIP
void register_vip(void)
{
	for(;;)
	{
		admin_vip_menu();

		switch(get_cmd('1','5'))
		{
		case '1': add_vip();	break;      //增加后勤人员
		case '2': reduce_vip();	break;    	//删除后勤人员
		case '3': change_vip();	break;  	//修改后勤人员信息
		case '4': show_vip();	break;
		case '5': return;
		}
	}
}

void add_vip(void)     //增加VIP
{
	// 判断用户是否已满
	if(cnt_vip >= VIP_MAX)
	{
		print_sec("VIP数量已满,无法添加！",0.75);
		return;
	}

	// 输入电话号
	printf("请输入VIP的手机号：\n");
	get_str(vip[cnt_vip].phone,sizeof(vip[cnt_vip].phone));
	// 检查电话是否被占用
	if(-1 < query_vipphone(vip[cnt_vip].phone))
	{
		print_sec("该电话已被占用，无法注册！",0.75);
		return;
	}

	// 输入密码
	printf("请输入密码:\n");
	char password[33];
	get_passwd(password,sizeof(password));
	printf("请再次输入密码:\n");
	get_passwd(vip[cnt_vip].password,sizeof(vip[cnt_vip].password));
	if(strcmp(vip[cnt_vip].password,password))
	{
		print_sec("密码输入不一致,请重新注册!",1);
		return;
	}
	//使用MD5进行加密
	MD5_CTX md5c;
	MD5Init(&md5c);
	int passwd_len = strlen(password);
	MD5Update(&md5c,(unsigned char*)password,passwd_len);
	MD5Final(&md5c,(unsigned char*)vip[cnt_vip].password);
	vip[cnt_vip].password[passwd_len] = '\0';
	
	vip[cnt_vip].points = 0;   //积分初值为0

	// 用户数量+1
	cnt_vip++;

	print_sec("注册成功!",0.75);
}

void reduce_vip(void)  //删除VIP
{
	system("clear");
	printf("请输入VIP电话:\n");
	char name[20];
	get_str(name,sizeof(name));
	int place = query_vipphone(name);
	if(-1 == place)
	{
		print_sec("没有该电话的VIP!\n",0.75);
		return;
	}
	reduce(place,REDUCE_VIP);
}

void change_vip(void)  //修改VIP信息
{
	system("clear");

	printf("请输入VIP电话号码:\n");
	char phone[20];
	get_str(phone,sizeof(phone));
	int place = query_vipphone(phone);
	if(-1 == place)
	{
		print_sec("没有该电话的VIP!\n",0.75);
		return;
	}
	printf("请输入该VIP的密码\n");
	char password[33];          									  //用于接受修改数据
	get_passwd(password,sizeof(password));

	//使用MD5进行加密
	MD5_CTX md5c;

	MD5Init(&md5c);
	int passwd_len = strlen(password);
	MD5Update(&md5c,(unsigned char*)password,passwd_len);
	MD5Final(&md5c,(unsigned char*)password);

	password[passwd_len] = '\0';

	if(strcmp(vip[place].password,password))                          //密码输入正确
	{
		print_sec("密码输入错误,不能修改!",0.75);
		return;
	}
	printf("请选择您要修改的信息\n");
	printf("1.电话号码  2.密码  3.不修改\n");
	switch(get_cmd('1','3'))
	{
		case '1': vip_phonechange(place);break;   
		case '2': vip_passwdchange(place);break;
	}	
}

void vip_phonechange(int place) 					//修改VIP的电话号码
{
	printf("您要修改为:\n");

	char phone[20];
	get_str(phone,sizeof(phone));
	if(!strcmp(phone,vip[place].phone))   			//用户输入的电话号码和自身不一样
	{
		print_sec("与上次电话一样，无需修改",0.75);
		return;
	}

	if(-1 == query_vipphone(phone))
	{
		strcpy(vip[place].phone,phone);
		print_sec("修改成功",0.75);
		return;
	}
	print_sec("电话已被注册!",0.75);
}

void vip_passwdchange(int place) 					//修改VIP的密码
{
	char password1[33];
	char password2[33];
	printf("您的密码修改为:\n");
	get_passwd(password1,sizeof(password1));
	printf("请再次输入您的密码:\n");
	get_passwd(password2,sizeof(password2));

	if(!strcmp(password1,password2))			//两次输入密码是否一致
	{
		//使用MD5进行加密
		MD5_CTX md5c;

		MD5Init(&md5c);
		int passwd_len = strlen(password1);
		MD5Update(&md5c,(unsigned char*)password1,passwd_len);
		MD5Final(&md5c,(unsigned char*)password1);
		password1[passwd_len] = '\0';

		if(0 == strcmp(password1,vip[place].password))
		{
			print_sec("输入与上次密码一致,无需修改!",1);
			return;
		}
		strcpy(vip[place].password,password1);
		print_sec("修改成功!",1);
		return;
	}
	print_sec("密码输入不一致,修改失败!",1);
}

void show_vip(void)     //遍历VIP
{
	qsort(vip,cnt_vip,sizeof(vip[0]),cmp_points);
	printf("会员余量为:%d\n",VIP_MAX-cnt_vip);
	for(int i=0; i<cnt_vip; i++)
	{
		printf("电话:%-10s 积分:%-6d\n",
			vip[i].phone,
			vip[i].points);
	}
	anykey_continue();
}







//管理收钱账户
void manage_money(void)
{
	if(0 == money.account[0])   //赋初值
	{
		strcpy(money.account,"88888888");
		money.account_money = 100;
		money.money_sum = 0;
	}
	for(;;)
	{
		money_menu();

		switch(get_cmd('1','3'))
		{
		case '1': change_accont();break;          //更改账户
		case '2': show_money(); break;            //查看账户
		case '3': return;
		}
	}
}

void change_accont(void)            //更改账户
{
	printf("您现在的账户为:%s\n",money.account);
	printf("您确定要修改账户么?");
	if(yes_or_no())
	{
		printf("请输入修改的账户:\n");
		get_str(money.account,sizeof(money.account));
		money.account_money = 0;
		return;
	}
	print_sec("修改失败",0.75);
}

void show_money(void)         //显示账户，超市信息
{
	printf("您的账户为:%s\n",money.account);
	printf("您账户的钱总和为:%.2lf\n",money.account_money);
	printf("今日超市总营业额为:%.2lf\n",money.money_sum);
	anykey_continue();
}

